package com.ia2014.tp.portal2.ejb.controller;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import javax.annotation.ManagedBean;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.enterprise.context.SessionScoped;

import com.ia2014.tp.portal2.dto.DepositoDto;
import com.ia2014.tp.portal2.dto.DespachoDto;
import com.ia2014.tp.portal2.dto.LogisticaDto;
import com.ia2014.tp.portal2.dto.PortalDto;
import com.ia2014.tp.portal2.ejb.ConfigRemote;
import com.ia2014.tp.portal2.exception.ConfigException;

/**
 * Controlador de configuraci�n
 * @author DiegoAlejandro
 *
 */
//@Named(value="configController")
@ManagedBean
@SessionScoped
public class ConfigController {
	
	@EJB(lookup="java:app/Config/ConfigBean")
	private ConfigRemote configBean;
	
	private PortalDto portal;
	private LogisticaDto logistica;
	private DespachoDto despacho;
	private DepositoDto deposito;
	private List<DespachoDto> despachos;
	private List<DepositoDto> depositos;
	private List<PortalDto> portales;
	

	private static final String MENU 			 = "menu.xhtml";
	private static final String VIEW_MODULOS 	 = "viewModulos.xhtml";
	private static final String DELETE_PORTAL  	 = "deletePortal.xhtml";
	private static final String DELETE_LOGISTICA = "deleteLogistica.xhtml";
	private static final String DELETE_DESPACHO  = "deleteDespacho.xhtml";
	private static final String DELETE_DEPOSITO  = "deleteDeposito.xhtml";
	private static final String DELETE_ALL		 = "deleteAllModulos.xhtml";
	private static final String ERROR_MODULOS 	 = "errorModulos.xhtml";
	
	
	public ConfigController(){
		super();
		
		this.deposito= new DepositoDto();
		this.despacho= new DespachoDto();
		this.logistica= new LogisticaDto();
		this.portal= new PortalDto();
		
		this.depositos= new ArrayList<DepositoDto>();
		this.despachos= new ArrayList<DespachoDto>();
		this.portales= new ArrayList<PortalDto>();
	}

	@PostConstruct
	public void initConfigController(){
		try {
			this.loadLogistica();
			this.loadDespachos();
			this.loadDepositos();
			this.loadPortales();
		} catch (ConfigException e) {
			e.printStackTrace();
		}
	}
	
	
	/**
	 * Lista el Modulo Logistica de la Base
	 * @throws ConfigException
	 */
	private void loadLogistica() throws ConfigException{
		
		LogisticaDto logisticaDto= this.configBean.listarLogistica();
		
		if (logisticaDto!=null){
			this.logistica= logisticaDto;
		}
		else{
			this.logistica= new LogisticaDto();
		}	
	}
	
	/**
	 * Lista los Despachos Disponibles
	 * @throws ConfigException
	 */
	private void loadDespachos() throws ConfigException{
		
		List<DespachoDto> despachosDto= this.configBean.listarDespachos();
		this.despachos=new ArrayList<DespachoDto>();
		
		if (despachosDto!=null){
			for (DespachoDto despachoDto: despachosDto){
				this.despachos.add(despachoDto);
			}
		}
	}
	
	/**
	 * Lista los modulos depositos
	 * @throws ConfigException
	 */
	private void loadDepositos()throws ConfigException{
		List<DepositoDto> depositosDto= this.configBean.listarDepositos();
		
		this.depositos= new ArrayList<DepositoDto>();
		
		if (depositosDto!=null){
			for(DepositoDto deposito:depositosDto){
				this.depositos.add(deposito);
			}
		}
	}
	
	/**
	 * Lista los Portales disponibles
	 * @throws ConfigException
	 */
	private void loadPortales()throws ConfigException{
		List<PortalDto> portalesDto= this.configBean.listarPortales();
		this.portales= new ArrayList<PortalDto>();
		
		if (portalesDto!=null){
			for (PortalDto portal: portalesDto){
				this.portales.add(portal);
			}
		}
	}
	
	/**
	 * Lista todos los Modulos
	 * @return viewModulos
	 */
	public String viewModulos(){
		String back = VIEW_MODULOS;
		
		try {
			this.loadLogistica();
			this.loadDespachos();
			this.loadDepositos();
			this.loadPortales();
		} catch (ConfigException e) {
			e.printStackTrace();
			back = ERROR_MODULOS;
		}
		return back;
	}
	
	
	/**
	 * Persiste un nuevo Portal en la BD y si no hay error, vuelve a l
	 * pantalla CreatePortal
	 * @return viewModulos o Error
	 */
	
	public String nuevoPortal(){
		
		try {
			if (portal!=null){
				this.configBean.crearPortal(portal);
			}
		} catch (ConfigException e) {
			e.printStackTrace();
			return ERROR_MODULOS;
		}
		this.portal.clean();
		return this.viewModulos();
	}
	

	
	/**
	 * Persiste un nuevo Logistica y lo persiste en la BD
	 * @return String
	 */
	public String nuevoLogistica(){
		
		try {
		    if (logistica!=null){
		    	
		    	this.configBean.crearLogistica(logistica);
		    	
		    }
		} catch (ConfigException e) {
			e.printStackTrace();
			return ERROR_MODULOS;
		}
		
		this.logistica.clean();
		return this.viewModulos();
	}
	
	
	/**
	 * Crea un modulo Despacho y lo persiste en la BD
	 * @return String
	 */
	public String nuevoDespacho(){
		
		try {
		   if(despacho!=null){
			   this.configBean.crearDespacho(despacho); 
		   }
		} catch (ConfigException e) {
			e.printStackTrace();
			return ERROR_MODULOS;
		}
		this.despacho.clean();
		return this.viewModulos();
	}

	/**
	 * Crea un modulo Deposito y lo persiste en la BD
	 * @return String
	 */
	public String nuevoDeposito(){
		
		try {
		   if(deposito!=null){
			 this.configBean.crearDeposito(deposito);  
		   }
		} catch (ConfigException e) {
			e.printStackTrace();
			return ERROR_MODULOS;
		}
		this.deposito.clean();
		return this.viewModulos();
	}
	
	
	/**
	 * Carga los Portales de la BD en la pagina deletePortal
	 * @return
	 */
	public String deletePortal(){
		try {
			this.loadPortales();
		} catch (ConfigException e) {
			e.printStackTrace();
			return ERROR_MODULOS;
		}
		return DELETE_PORTAL;
	}
	
	/**
	 * Elimina el Portal Seleccionado
	 * @return 
	 */
	public String eliminarPortal(){
		
			try {
				this.configBean.eliminarPortal(portal.getIdModulo());
			} catch (ConfigException e) {
				e.printStackTrace();
				return ERROR_MODULOS;
			}
			
		 this.portal.clean();
		 return this.viewModulos();
	}
	
	/**
	 * Carga Logistica de la BD en la pagina deleteLogistica
	 * @return
	 */
	public String deleteLogistica(){
		try {
			this.loadLogistica();
		} catch (ConfigException e) {
			e.printStackTrace();
			return ERROR_MODULOS;
		}
		return DELETE_LOGISTICA;
	}
	
	/**
	 * Elimina el modulo Logistica Seleccionado
	 * @return viewModulos
	 */
	public String eliminarLogistica(){
	
		try {
			this.configBean.eliminarLogistica(logistica.getIdModulo());
		} catch (ConfigException e) {
			e.printStackTrace();
			return ERROR_MODULOS;
		}
		this.logistica.clean();
		return this.viewModulos();
}
	
	/**
	 * Carga Despachos de la BD en la pagina deleteDespacho
	 * @return
	 */
	public String deleteDespacho(){
		try {
			this.loadDespachos();
		} catch (ConfigException e) {
			e.printStackTrace();
			return ERROR_MODULOS;
		}
		return DELETE_DESPACHO;
	}
	
	/**
	 * Elimina el modulo Despacho Seleccionado
	 * @return viewModulos
	 */
	public String eliminarDespacho(){
		
		try {
			this.configBean.eliminarDespacho(despacho.getIdModulo());
		} catch (ConfigException e) {
			e.printStackTrace();
			return ERROR_MODULOS;
		}
		this.despacho.clean();
		return this.viewModulos();
	}
	
	/**
	 * Carga Depositos de la BD en la pagina deleteDeposito
	 * @return
	 */
	public String deleteDeposito(){
		try {
			this.loadDepositos();
		} catch (ConfigException e) {
			e.printStackTrace();
			return ERROR_MODULOS;
		}
		return DELETE_DEPOSITO;
	}
	
	/**
	 * Elimina el modulo Deposito Seleccionado
	 * @return viewModulos
	 */
	public String eliminarDeposito(){
		
		try {
			this.configBean.eliminarDeposito(deposito.getIdModulo());
		} catch (ConfigException e) {
			e.printStackTrace();
			return ERROR_MODULOS;
		}
		this.deposito.clean();
		return this.viewModulos();
	}
	
	
	/**
	 * Lista todos los Modulos para luego eleminarlos
	 * @return viewModulos
	 */
	public String deleteAllModulos(){
		String back = DELETE_ALL;
		
		try {
			this.loadLogistica();
			this.loadDespachos();
			this.loadDepositos();
			this.loadPortales();
		} catch (ConfigException e) {
			e.printStackTrace();
			back = ERROR_MODULOS;
		}
		return back;
	}
	
	/**
	 * Elimina Todos los modulos de la BD
	 * @return
	 */
	public String eliminarAllModulos(){
		
		String back= VIEW_MODULOS;
		this.configBean.eliminarTodosLosModulos();
		
		this.deposito = null; 
		this.despacho = null;
		this.portal = null;
		this.logistica = null;
		
		this.depositos=new ArrayList<DepositoDto>();
		this.portales = new ArrayList<PortalDto>();
		this.despachos = new ArrayList<DespachoDto>();
		
		/*
		try {	
			if (this.portales!=null){
				this.configBean.eliminaPortales(portales);
			}
			
			if (this.logistica!=null){
				this.configBean.eliminarLogistica(logistica.getIdModulo());
			}
			
			if (this.depositos!=null){
				this.configBean.eliminaDepositos(depositos);
			}
			if (this.despachos!=null){
				this.configBean.eliminaDespachos(despachos);
			}

			} //Try
				catch (ConfigException e) {
				e.printStackTrace();
				back= ERROR_MODULOS;
			}
		*/	
		return back;	
	}

	
	public ConfigRemote getConfigBean() {
		return configBean;
	}

	public void setConfigBean(ConfigRemote configBean) {
		this.configBean = configBean;
	}



	public LogisticaDto getLogistica() {
		return logistica;
	}

	public void setLogistica(LogisticaDto logistica) {
		this.logistica = logistica;
	}

	//Ignacio Iljin	
	public List<DespachoDto> getDespachos() {
		return despachos;
	}

	public void setDespachos(List<DespachoDto> despachos) {
		this.despachos = despachos;
	}

	public List<DepositoDto> getDepositos() {
		return depositos;
	}

	public void setDepositos(List<DepositoDto> depositos) {
		this.depositos = depositos;
	}

	public List<PortalDto> getPortales() {
		return portales;
	}

	public void setPortales(List<PortalDto> portales) {
		this.portales = portales;
	}

	public PortalDto getPortal() {
		return portal;
	}

	public void setPortal(PortalDto portal) {
		this.portal = portal;
	}

	public DespachoDto getDespacho() {
		return despacho;
	}

	public void setDespacho(DespachoDto despacho) {
		this.despacho = despacho;
	}

	public DepositoDto getDeposito() {
		return deposito;
	}

	public void setDeposito(DepositoDto deposito) {
		this.deposito = deposito;
	}

	public void removeDepositoDTO(Integer idModuloInteger) {
		boolean encontrado = false;
		if (this.depositos != null){
			Iterator<DepositoDto> it = this.depositos.iterator();
			while (it.hasNext() && !encontrado){
				DepositoDto dto = it.next();
				if (dto.getIdModulo().equals(idModuloInteger)){
					it.remove();
					encontrado = true;
				}
			}
		}
		
	}
	
	public void removeDespachoDTO(Integer idModuloInteger){
		boolean encontrado = false;
		if (this.despachos!=null){
			Iterator<DespachoDto> it= this.despachos.iterator();
			while(it.hasNext()&& !encontrado){
				DespachoDto dto= it.next();
				if (dto.getIdModulo().equals(idModuloInteger)){
					it.remove();
					encontrado=true;
				}
			}
		}
	}
	
	public void removePortalDTO(Integer idModuloInteger){
		boolean encontrado = false;
		if (this.portales!=null){
			Iterator<PortalDto> it= this.portales.iterator();
			while(it.hasNext()&& !encontrado){
				PortalDto dto= it.next();
				if (dto.getIdModulo().equals(idModuloInteger)){
					it.remove();
					encontrado=true;
				}
			}
		}
	}
	
	
	public void removeLogisticaDTO(Integer idModuloInteger){
		if ((this.logistica!=null) && (this.logistica.getIdModulo()==idModuloInteger)){
				this.logistica.clean();
			}
		}
	
	


}
